# from numpy import block
import taichi as ti

ti.init(arch=ti.cuda)

n = 720

# 最简单的定义field方式，dense的数据结构
pixels = ti.Vector.field(3, ti.f32, shape=(n*3,n))

# 比较高级的定义field的方式，也是dense的数据结构
# pixels = ti.Vector.field(3, ti.f32)
# block = ti.root.dense(ti.ij, (n*3, n)).place(pixels)

#使用pointer的稀疏数据结构
# pixels = ti.Vector.field(3, ti.f32)
# block = ti.root.pointer(ti.ij, (n*3, n)).place(pixels)

# 使用bitmasked的稀疏数据结构
# pixels = ti.Vector.field(3, ti.f32)
# block = ti.root.bitmasked(ti.ij, (n*3, n)).place(pixels)

#使用复合类型的数据结构
# vec3f = ti.types.vector(3, ti.f32)
# pixels = vec3f.field(shape=(n*3, n))

@ti.kernel
def paint(t: float):
    # for i, j in pixels:  #此行适用于dense数据结构 以及 一般复合类型数据结构  但不支持pointer bismasked等底层为指针的稀疏结构
    for i, j in ti.ndrange((0,n*3),(0,n)):   #此行适用于上述所有结构  
        pixels[i, j] = [0,0,0]  #clear screen  清屏

        r = i * (2.2 / n) 
        z = 0.9 * ti.cos(ti.random())

        iterations = 0
        while iterations < 10000:
            z = r * z * (1 - z)
            iterations += 1
        jj = ti.cast(z * n * 0.9, ti.i32)
        pixels[i, jj] = [ti.cos(jj*0.03), 20, 90]


gui = ti.GUI("logistic  ", pixels.shape)

for i in range(1000000):
    # gui.clear(0x000000)
    paint(i * 0.03)
    gui.set_image(pixels)
    gui.show()        
 
  